// ProjectName: go-learn-demo
// PackageName: ginybxb
// Description:
// Author: hy.bai
// Date: 2025-08-02 21:53

package ginybxb

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log/slog"
)

// 测试获取请求头中的参数
func TestShouldBind() {
	// 1.实例化Gin对象
	r := gin.Default()
	// 2.注册请求路径和处理方法。即：绑定路由规则，执行的函数
	r.POST("/login", LoginHandler)
	// 3.启动一个服务
	addr := ":8080"
	slog.Info(fmt.Sprintf("服务运行地址是:http://127.0.0.1%s", addr))
	if err := r.Run(addr); err != nil {
		slog.Error(fmt.Sprintf("服务启动失败, 原因是:%s", err.Error()))
	}
}

// 处理登录请求
func LoginHandler(context *gin.Context) {
	var params = new(struct { // 实例化一个匿名结构体
		// required表示参数是必填项，如果缺失会报错。
		// 结构体的key是可以是json,也可以是form,且一般情况下都会写
		// Username string `json:"username" binding:"required"` // 接收json格式的参数
		// Username string `form:"username" binding:"required"` // 接收form表单格式的参数
		Username string `form:"username" json:"username" binding:"required"`
		Password string `form:"password" json:"password" binding:"required"`
		// json的tag用于接收application/json格式的参数
		// form的tag用于接收application/x-www-form-urlencoded格式的参数.(Get请求)
	})
	// 自动把context中的request请求对象中请求体参数把绑定到指定的结构体上。
	if err := context.ShouldBind(params); err != nil {
		ginHandleResp(context, 4000, "参数错误,原因是:"+err.Error(), nil)
		return
	}
	data := fmt.Sprintf("用户名是:%s,密码是:%s", params.Username, params.Password)
	ginHandleResp(context, 2000, "登录成功", data)
}
